#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :picturedemo.py
# @Time      :2021/3/14 10:41
# @Author    :Letquit
"""
文件说明：图片转字符画
字符画是一系列字符的组合，我们可以把字符看作是比较大块的像素，一个字符能表现一种颜色（为了简化可以这么理解），
字符的种类越多，可以表现的颜色也越多，图片也会更有层次感。
使用灰度值公式将像素的 RGB 值映射到灰度值
gray ＝ 0.2126 * r + 0.7152 * g + 0.0722 * b
这样就好办了，我们可以创建一个不重复的字符列表，灰度值小（暗）的用列表开头的符号，灰度值大（亮）的用列表末尾的符号。
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

"""
from PIL import Image   # 导入库

IMG = 'D:\Code\\photo\\dlam.png'  # 图片绝对地址

WIDTH = 60  # 宽度    宽度:高度
HEIGHT = 50  # 高度

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")    # 字符表


# 将256灰度映射到70个字符上
def get_char(r, g, b, alpha=256):   # 透明度alpha=256
    if alpha == 0:  # 如果透明度为0则输出
        return ' '
    length = len(ascii_char)    # 字符表个数 70
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)    # 计算灰度
    unit = (256.0 + 1) / length     # 每个单元
    return ascii_char[int(gray / unit)]    # 不同的灰度对应着不同的字符


if __name__ == "__main__":
    im = Image.open(IMG)    # 读取图片
    im = im.resize((WIDTH, HEIGHT), Image.NEAREST)  # resize image with high-quality
    txt = ''
    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j, i)))
        txt += '\n'

    print(txt)

    # 写入文件
    with open("output.txt",'w') as f:
        f.write(txt)
    run_code = 0
